//
//  BaseHttpRequestModel.h
//  GSDache
//
//  Created by tanyin on 16/11/28.
//  Copyright © 2016年 tanyin. All rights reserved.
//

#import <Foundation/Foundation.h>

@class AFHTTPSessionManager;

typedef void(^requestServerSuccessed)(id result, id page);
typedef void(^requestServerFailed)(NSError *error);
typedef void(^requestServerProgress)(NSProgress *progress);
typedef void(^requestServerComplete)(void);
/*!
 请求服务器的错误代码定义, 待补充.
 */
typedef enum : NSUInteger {
    
    /*!
     *  @brief 操作成功状态码
     *
     *  @since 访问服务器操作成功返回的状态码
     */
    NORMAL_CODE = 200,
    /*!
     *  @brief 没有网络
     *
     *  @since 没有网络的错误代码
     */
    NO_NETWORK = 1001,
    
    /*!
     *  @brief 令牌错误
     *
     *  @since 令牌错误的代码 包含但不限制于 令牌错误, 令牌过期.
     */
    TOKEN_ERROR = 401,

} ErrorCode;

typedef enum : NSUInteger {
    GET = 0,
    POST,
    PUT,
    DELETE,
    
} HttpRequestMethod;

/*
 *  @brief 底层数据Model, 任何基于本框架创建的需要将数据传递到服务器的Model需继承该控制器.
 */
@interface BaseHttpRequestModel : NSObject

-(AFHTTPSessionManager *)requestSession;

/********************************************************************
 * 方法名称: relativelyUrl <br>
 * 功能描述: 相对的一个服务器地址, 由子类进行重写 <br>
 * 输出参数: 相对的URL地址 <br>
 * 返 回 值: 相对的URL地址 <br>
 ********************************************************************/
-(NSString *)relativelyUrl;

/********************************************************************
 * 方法名称: absoluteUrl <br>
 * 功能描述: 请求服务器的绝对地址, 由BaseNetWwork调用 <br>
 * 输出参数: 请求服务器的绝对地址 <br>
 * 返 回 值: 请求服务器的绝对地址 <br>
 ********************************************************************/
-(NSString *)absoluteUrl;

/*!
 *  @brief 上传流文件, 图片, 音频等.(子类重写)
 *
 *  @return 返回一个需要上传的数组. 格式为: [{"data": , "fileName": "", "name" : "name" mimeType : "mimeType"},{}];
 */
-(NSMutableArray *)uploadDatas;

-(BOOL)shouldEncryption;

/*!
 *  @brief 请求头的参数设置, 子类重写
 *
 *  @return 请求头的参数数组. 格式为: {key:value};
 */
-(NSDictionary *)headerParameter;

-(HttpRequestMethod)requestMethod;

/**
 *  请求参数
 *  可子类重写
 */
-(id)requestParameter;

/********************************************************************
 * 方法名称: modelCustomTransformToDictionary <br>
 * 功能描述: 封装Model忽略的参数(子类必须调用) <br>
 * 输入参数: dic 预估会封装的参数 <br>
 * 输出参数: 是否操作完成 <br>
 * 返 回 值: 是否操作完成 <br>
 ********************************************************************/
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;

- (void)requestServer;

- (Class)responseClass;

#pragma mark - Parser Function
-(BOOL)success:(NSURLSessionDataTask *)task data:(id)obj;
-(void)failure:(NSURLSessionDataTask *)task error:(NSError *)error;

/**
 *  请求回调block
 */
@property(copy, nonatomic, setter=didRequestSuccessed:) requestServerSuccessed requestSuccessed;
@property(copy, nonatomic, setter=didRequestFailed:) requestServerFailed requestFailed;
@property(copy, nonatomic, setter=didRequestProgress:) requestServerProgress requestProgress;
@property (nonatomic,copy, setter=didRequestCompleted:) requestServerComplete requestComplete;


- (void)didRequestSuccessed:(requestServerSuccessed)successedHandler;
- (void)didRequestFailed:(requestServerFailed)failedHandler;
- (void)didRequestProgress:(requestServerProgress)progressHandler;
- (void)didRequestCompleted:(requestServerComplete)completeHander;

@end
